IPC机制: 线程之间的通信,指两个线程之间进行数据交换
队列的实现: 管道 + 锁
在队列中数据是安全的,因为队列中有锁的机制,保证多个线程修改同一块数据时,同一时间只能有一个任务可以进行修改
线程之间通信,直接使用 queue 模块
如果要实现线程之间的通信,就使用队列来实现就可以了,不要使用 Pipe管道 或者 Manager 来实现,因为数据不安全虽然可以加锁来实现数据安全,但是队列已经自带锁的机制了
1. queue.Queue() -> 先进先出
import queue
q = queue.Queue()
q.put('a')
q.put('b')
q.put('c')
print(q.qsize()) # 3
print(q.get()) # a
print(q.get()) # b
print(q.get()) # c
2. queue.LifoQueue() -> 后进先出
import queue
lfq = queue.LifoQueue()
lfq.put('a')
lfq.put('b')
lfq.put('c')
print(lfq.qsize()) # 3
print(lfq.get()) # c
print(lfq.get()) # b
print(lfq.get()) # a
3. queue.PriorityQueue() -> 根据权限输出,值越小越优先,值相同就根据 ascii 进行判断最小值先出
import queue
pq = queue.PriorityQueue()
pq.put((5, 'dd'))
pq.put((1, 'b'))
pq.put((1, 'aa'))
print(pq.qsize()) # 3
print(pq.get()) # (1, 'aa')
print(pq.get()) # (1, 'b')
print(pq.get()) # (5, 'dd')
4. 子线程与子线程之间的通讯
import queue
from threading import Thread
def fun1():
q.put('hello') # 将值添加到队列中 -> 直接调用外部的变量, 因为一个进程中的多个线程是可以直接使用这个进程中的数据,且一个py文件就相当于一个进程,不按照线程的说法: 函数本来就可以调用外部的变量和方法,因为作用域链
def fun2():
print(q.get()) # 通过队列获取其他子线程的值 -> 直接调用外部的变量, 因为一个进程中的多个线程是可以直接使用这个进程中的数据,且一个py文件就相当于一个进程,不按照线程的说法: 函数本来就可以调用外部的变量和方法,因为作用域链
q = queue.Queue()
t1 = Thread(target=fun1)
t1.start()
t2 = Thread(target=fun2)
t2.start()